home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / NewInstanceExpression.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  6.4 KB  |  165 lines

  1. package sun.tools.tree;
  2.  
  3. import java.util.Hashtable;
  4. import java.util.Vector;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.java.AmbiguousField;
  7. import sun.tools.java.ClassDeclaration;
  8. import sun.tools.java.ClassDefinition;
  9. import sun.tools.java.ClassNotFound;
  10. import sun.tools.java.CompilerError;
  11. import sun.tools.java.Constants;
  12. import sun.tools.java.Environment;
  13. import sun.tools.java.FieldDefinition;
  14. import sun.tools.java.Type;
  15.  
  16. public class NewInstanceExpression extends NaryExpression {
  17.    FieldDefinition field;
  18.    final int MAXINLINECOST = 30;
  19.  
  20.    public NewInstanceExpression(int var1, Expression var2, Expression[] var3) {
  21.       super(42, var1, Type.tError, var2, var3);
  22.    }
  23.  
  24.    public NewInstanceExpression(int var1, FieldDefinition var2, Expression[] var3) {
  25.       super(42, var1, var2.getType(), (Expression)null, var3);
  26.       this.field = var2;
  27.    }
  28.  
  29.    int precedence() {
  30.       return 100;
  31.    }
  32.  
  33.    public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
  34.       Type var6 = super.right.toType(var1, var2);
  35.       super.right = new TypeExpression(super.right.where, var6);
  36.       boolean var7 = var6.isType(13);
  37.       if (!var6.isType(10) && !var7) {
  38.          var1.error(super.where, "invalid.arg.type", var6, Constants.opNames[super.op]);
  39.          var7 = true;
  40.       }
  41.  
  42.       Type[] var8 = new Type[super.args.length];
  43.  
  44.       for(int var9 = 0; var9 < super.args.length; ++var9) {
  45.          var3 = super.args[var9].checkValue(var1, var2, var3, var5);
  46.          var8[var9] = super.args[var9].type;
  47.          var7 = var7 || var8[var9].isType(13);
  48.       }
  49.  
  50.       if (var7) {
  51.          super.type = Type.tError;
  52.          return var3;
  53.       } else {
  54.          ClassDeclaration var10 = var1.getClassDeclaration(var6);
  55.  
  56.          try {
  57.             ClassDefinition var11 = var10.getClassDefinition(var1);
  58.             if (var11.isInterface()) {
  59.                var1.error(super.where, "new.intf", var10);
  60.                return var3;
  61.             }
  62.  
  63.             if (var11.isAbstract(var1)) {
  64.                var1.error(super.where, "new.abstract", var10);
  65.                return var3;
  66.             }
  67.  
  68.             if (!var2.field.getClassDefinition().canAccess(var1, var11.getClassDeclaration())) {
  69.                var1.error(super.where, "cant.access.class", var11);
  70.                return var3;
  71.             }
  72.  
  73.             ClassDefinition var12 = var2.field.getClassDefinition();
  74.             this.field = var11.matchMethod(var1, var12, Constants.idInit, var8);
  75.             if (this.field == null) {
  76.                String var19 = var10.getName().getName().toString();
  77.                var19 = Type.tMethod(Type.tError, var8).typeString(var19, false, false);
  78.                var1.error(super.where, "unmatched.constr", var19, var10);
  79.                return var3;
  80.             }
  81.          } catch (ClassNotFound var14) {
  82.             var1.error(super.where, "class.not.found", var14.name, Constants.opNames[super.op]);
  83.             return var3;
  84.          } catch (AmbiguousField var15) {
  85.             var1.error(super.where, "ambig.constr", var15.field1, var15.field2);
  86.             return var3;
  87.          }
  88.  
  89.          var8 = this.field.getType().getArgumentTypes();
  90.  
  91.          for(int var17 = 0; var17 < super.args.length; ++var17) {
  92.             super.args[var17] = ((Node)this).convert(var1, var2, var8[var17], super.args[var17]);
  93.          }
  94.  
  95.          ClassDeclaration[] var18 = this.field.getExceptions(var1);
  96.  
  97.          for(int var13 = 0; var13 < var18.length; ++var13) {
  98.             if (var5.get(var18[var13]) == null) {
  99.                var5.put(var18[var13], this);
  100.             }
  101.          }
  102.  
  103.          super.type = var6;
  104.          return var3;
  105.       }
  106.    }
  107.  
  108.    public long check(Environment var1, Context var2, long var3, Hashtable var5) {
  109.       return this.checkValue(var1, var2, var3, var5);
  110.    }
  111.  
  112.    Expression inlineNewInstance(Environment var1, Context var2, Statement var3) {
  113.       if (var1.dump()) {
  114.          System.out.println("INLINE NEW INSTANCE " + this.field + " in " + var2.field);
  115.       }
  116.  
  117.       Vector var4 = this.field.getArguments();
  118.       Statement[] var5 = new Statement[var4.size() + 1];
  119.  
  120.       for(int var6 = 0; var6 < super.args.length; ++var6) {
  121.          var5[var6] = new VarDeclarationStatement(super.where, (LocalField)var4.elementAt(var6 + 1), super.args[var6]);
  122.       }
  123.  
  124.       var5[var5.length - 1] = var3 != null ? var3.copyInline(var2, false) : null;
  125.       return (new InlineNewInstanceExpression(super.where, super.type, this.field, new CompoundStatement(super.where, var5))).inline(var1, var2);
  126.    }
  127.  
  128.    public Expression inline(Environment var1, Context var2) {
  129.       return this.inlineValue(var1, var2);
  130.    }
  131.  
  132.    public Expression inlineValue(Environment var1, Context var2) {
  133.       try {
  134.          for(int var3 = 0; var3 < super.args.length; ++var3) {
  135.             super.args[var3] = super.args[var3].inlineValue(var1, var2);
  136.          }
  137.  
  138.          return this;
  139.       } catch (ClassNotFound var4) {
  140.          throw new CompilerError(var4);
  141.       }
  142.    }
  143.  
  144.    public void code(Environment var1, Context var2, Assembler var3) {
  145.       var3.add(super.where, 187, this.field.getClassDeclaration());
  146.  
  147.       for(int var4 = 0; var4 < super.args.length; ++var4) {
  148.          super.args[var4].codeValue(var1, var2, var3);
  149.       }
  150.  
  151.       var3.add(super.where, 183, this.field);
  152.    }
  153.  
  154.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  155.       var3.add(super.where, 187, this.field.getClassDeclaration());
  156.       var3.add(super.where, 89);
  157.  
  158.       for(int var4 = 0; var4 < super.args.length; ++var4) {
  159.          super.args[var4].codeValue(var1, var2, var3);
  160.       }
  161.  
  162.       var3.add(super.where, 183, this.field);
  163.    }
  164. }
  165.